package com.example.excel_db.controller;

import com.example.excel_db.dto.ApiResponse;
import com.example.excel_db.dto.ExcelTemplateDTO;
import com.example.excel_db.dto.ExcelTemplateFieldDTO;
import com.example.excel_db.service.ExcelTemplateService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * Excel模板管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/excel/templates")
@RequiredArgsConstructor
public class ExcelTemplateController {

    private final ExcelTemplateService templateService;

    /**
     * 创建模板
     */
    @PostMapping
    public ApiResponse<ExcelTemplateDTO> createTemplate(@RequestBody ExcelTemplateDTO templateDTO) {
        try {
            ExcelTemplateDTO result = templateService.createTemplate(templateDTO);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("创建模板失败", e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 更新模板
     */
    @PutMapping("/{id}")
    public ApiResponse<ExcelTemplateDTO> updateTemplate(@PathVariable Long id, @RequestBody ExcelTemplateDTO templateDTO) {
        try {
            templateDTO.setId(id);
            ExcelTemplateDTO result = templateService.updateTemplate(templateDTO);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("更新模板失败: id={}", id, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 删除模板
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteTemplate(@PathVariable Long id) {
        try {
            templateService.deleteTemplate(id);
            return ApiResponse.success();
        } catch (Exception e) {
            log.error("删除模板失败: id={}", id, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 获取模板详情
     */
    @GetMapping("/{id}")
    public ApiResponse<ExcelTemplateDTO> getTemplate(@PathVariable Long id) {
        try {
            ExcelTemplateDTO result = templateService.getTemplateById(id);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("获取模板失败: id={}", id, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 获取所有模板
     */
    @GetMapping
    public ApiResponse<List<ExcelTemplateDTO>> getAllTemplates() {
        try {
            List<ExcelTemplateDTO> result = templateService.getAllTemplates();
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("获取所有模板失败", e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 分页获取模板
     */
    @GetMapping("/page")
    public ApiResponse<Page<ExcelTemplateDTO>> getTemplates(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        try {
            PageRequest pageRequest = PageRequest.of(page, size, Sort.by("id").descending());
            Page<ExcelTemplateDTO> result = templateService.getTemplates(pageRequest);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("分页获取模板失败", e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 添加模板字段
     */
    @PostMapping("/{templateId}/fields")
    public ApiResponse<ExcelTemplateFieldDTO> addTemplateField(
            @PathVariable Long templateId,
            @RequestBody ExcelTemplateFieldDTO fieldDTO) {
        try {
            ExcelTemplateFieldDTO result = templateService.addTemplateField(templateId, fieldDTO);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("添加模板字段失败: templateId={}", templateId, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 更新模板字段
     */
    @PutMapping("/fields/{fieldId}")
    public ApiResponse<ExcelTemplateFieldDTO> updateTemplateField(
            @PathVariable Long fieldId,
            @RequestBody ExcelTemplateFieldDTO fieldDTO) {
        try {
            fieldDTO.setId(fieldId);
            ExcelTemplateFieldDTO result = templateService.updateTemplateField(fieldDTO);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("更新模板字段失败: fieldId={}", fieldId, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 删除模板字段
     */
    @DeleteMapping("/fields/{fieldId}")
    public ApiResponse<Void> deleteTemplateField(@PathVariable Long fieldId) {
        try {
            templateService.deleteTemplateField(fieldId);
            return ApiResponse.success();
        } catch (Exception e) {
            log.error("删除模板字段失败: fieldId={}", fieldId, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 获取模板字段列表
     */
    @GetMapping("/{templateId}/fields")
    public ApiResponse<List<ExcelTemplateFieldDTO>> getTemplateFields(@PathVariable Long templateId) {
        try {
            List<ExcelTemplateFieldDTO> result = templateService.getTemplateFields(templateId);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("获取模板字段列表失败: templateId={}", templateId, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 上传模板文件
     */
    @PostMapping("/{templateId}/upload")
    public ApiResponse<ExcelTemplateDTO> uploadTemplateFile(
            @PathVariable Long templateId,
            @RequestParam("file") MultipartFile file) {
        try {
            ExcelTemplateDTO result = templateService.uploadTemplateFile(templateId, file);
            return ApiResponse.success(result);
        } catch (Exception e) {
            log.error("上传模板文件失败: templateId={}", templateId, e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 下载模板文件
     */
    @GetMapping("/{templateId}/download")
    public ResponseEntity<byte[]> downloadTemplateFile(@PathVariable Long templateId) {
        try {
            byte[] fileContent = templateService.downloadTemplateFile(templateId);
            ExcelTemplateDTO template = templateService.getTemplateById(templateId);
            
            return ResponseEntity.ok()
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + template.getName() + ".xlsx\"")
                    .body(fileContent);
        } catch (Exception e) {
            log.error("下载模板文件失败: templateId={}", templateId, e);
            return ResponseEntity.badRequest().build();
        }
    }

    /**
     * 生成空白模板文件
     */
    @GetMapping("/{templateId}/generate")
    public ResponseEntity<byte[]> generateEmptyTemplateFile(@PathVariable Long templateId) {
        try {
            byte[] fileContent = templateService.generateEmptyTemplateFile(templateId);
            ExcelTemplateDTO template = templateService.getTemplateById(templateId);
            
            return ResponseEntity.ok()
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + template.getName() + ".xlsx\"")
                    .body(fileContent);
        } catch (Exception e) {
            log.error("生成空白模板文件失败: templateId={}", templateId, e);
            return ResponseEntity.badRequest().build();
        }
    }
}